-- LocationAgent
-- Created by lijh 2016/11/22
-- 封装 iOS 定位接口

module("LocationAgent", package.seeall);

local PURE_FILE = "LocationAgent";

-- iOS 定位授权状态码
-- 说明：
-- 1. 当状态为 NOT_DETERMINED 时，可以调用 requestAuthorization 接口打开系统申请定位权限的窗口
-- 2. 当状态为 RESTRICTED 或 DENIED 时，说明用户拒绝了定位授权，此时需要引导玩家自行打开 系统设置->隐私->定位服务，并授予权限
-- 3. 状态为 AUTHORIZED_ALWAYS 或者 AUTHORIZED_WHEN_IN_USE，说明用户已经同意授权，可以正常发起定位请求
STATUS_NOT_DETERMINED = 0;            -- 用户尚未决定是否授权
STATUS_RESTRICTED = 1;                -- 受限的定位权限？
STATUS_DENIED = 2;                    -- 拒绝定位
STATUS_AUTHORIZED_ALWAYS = 3;         -- 允许后台一直使用定位服务
STATUS_AUTHORIZED_WHEN_IN_USE = 4;    -- 仅运行在前台时才可使用定位服务

-- 定位超时时间
local locationTimeout = 20;

-- 内部函数声明
local onLocationSuccess;
local onLocationFailed;
local onAuthorizationStatusChanged;

-- 初始化
function init()
    -- 注册定位权限变更的回调
    SdkMgr.registerOCCallback("onAuthorizationStatusChanged", onAuthorizationStatusChanged);

    -- 注册定位成功的回调
    SdkMgr.registerOCCallback("onLocationSuccess", onLocationSuccess);

    -- 注册定位失败的回调
    SdkMgr.registerOCCallback("onLocationFailed", onLocationFailed);

    -- SDK 初始化
    callOCFuncWithClass("LocationWrap", "locationInit", {
        timeout = locationTimeout,
    });
end

-- 判断定位服务是否开启
function isServiceEnabled()
    local ret = callOCFuncWithClass("LocationWrap", "isServiceEnabled");

    return ret;
end

-- 开启定位服务（跳转到设置界面）
function enableService()
    callOCFuncWithClass("LocationWrap", "enableService");
end

-- 获取当前定位权限授权状态
function getAuthorizationStatus()
    local status = callOCFuncWithClass("LocationWrap", "getAuthorizationStatus");

    return status;
end

-- 申请定位权限授权（仅当状态为 NotDetermined 时才可以呼出系统授权窗口）
function requestAuthorization()
    callOCFuncWithClass("LocationWrap", "requestAuthorization");
end

-- 发起定位
function requestLocation()
    callOCFuncWithClass("LocationWrap", "requestLocation");
end

-- 定位权限变更的回调
function onAuthorizationStatusChanged(param)
    local ret = string.parseJsonToTable(param);
    local status = ret["status"];

    trace(PURE_FILE, string.format("location authorization status changed to: %d", status));
end

-- 定位成功回调
function onLocationSuccess(param)
    local ret = string.parseJsonToTable(param);
    local longitude = ret["longitude"];
    local latitude  = ret["latitude"];
    local altitude  = ret["altitude"];

    trace(PURE_FILE, string.format("location success: longitude:%f, latitude:%f, altitude:%f", longitude, latitude, altitude));
    LocationM.onSuccess(latitude, longitude);
end

-- 定位失败回调
function onLocationFailed(param)
    local ret = string.parseJsonToTable(param);
    local errCode = ret["errCode"];

    trace(PURE_FILE, "location failed with errror code: %d", errCode);
    LocationM.onFail(tostring(errCode));
end